package ControleAcademico.View;

import java.util.ArrayList;
import java.util.Scanner;

import ControleAcademico.Model.Dao.AlunoImpl;
import ControleAcademico.Model.Dao.DisciplinaImpl;
import ControleAcademico.Model.Dao.FaltasImpl;
import ControleAcademico.Model.Dao.HistoricoAtividadeImpl;
import ControleAcademico.Model.Dao.HistoricoDisciplinaImpl;
import ControleAcademico.Model.Dao.ProfessorImpl;
import ControleAcademico.Model.Dao.TurmaImpl;
import ControleAcademico.Model.Pojo.Aluno;
import ControleAcademico.Model.Pojo.Atividade;
import ControleAcademico.Model.Pojo.Disciplina;
import ControleAcademico.Model.Pojo.Faltas;
import ControleAcademico.Model.Pojo.HistoricoAtividade;
import ControleAcademico.Model.Pojo.HistoricoDisciplina;
import ControleAcademico.Model.Pojo.Professor;
import ControleAcademico.Model.Pojo.Turma;

public class MenuTurma {
		
	private TurmaImpl turmaImpl;
	private FaltasImpl faltasImpl;
	private DisciplinaImpl disciplinaImpl;
	private HistoricoDisciplinaImpl historicoDisciplinaImpl;
	private ProfessorImpl professorImpl;
	private AlunoImpl alunoImpl;
	private HistoricoAtividadeImpl historicoAtividadeImpl;
	
	public MenuTurma (TurmaImpl turmaImpl, FaltasImpl faltasImpl,DisciplinaImpl disciplinaImpl, ProfessorImpl professorImpl, AlunoImpl alunoImpl,HistoricoAtividadeImpl historicoAtividadeImpl,HistoricoDisciplinaImpl historicoDisciplinaImpl){
		this.turmaImpl = turmaImpl;
		this.faltasImpl = faltasImpl;
		this.disciplinaImpl = disciplinaImpl;
		this.historicoDisciplinaImpl = historicoDisciplinaImpl;
		this.professorImpl = professorImpl;
		this.alunoImpl = alunoImpl;
		this.historicoAtividadeImpl = historicoAtividadeImpl;
		
	}
		
	public void cadastrar(){
			
			Scanner lerDados = new Scanner(System.in);
		
			Disciplina disciplina2 = null;
			ArrayList<Disciplina> auxiliarDisciplina;
			
			ArrayList<Professor> listaDeProfessores = new ArrayList<Professor>();
			ArrayList<Professor> auxiliarProfessor;
			ArrayList<Professor> professoresDisciplina = new ArrayList<Professor>();
			Turma turma = null;
			auxiliarDisciplina = disciplinaImpl.getListaDeDisciplinas();
			int options = 0;
			int j = 1;
			int i = 1;
			int flag = 0;
			auxiliarProfessor = professorImpl.getListaDeProfessores();
			while (flag != -1) {				
							options = 0;
							j = 1;
							i = 1;
							
							
				/*----------------------------------------------------------------------------------------*/
				// Listando as disciplinas			
				/*----------------------------------------------------------------------------------------*/

							for(int a=0;a<50;a++){
								System.out.println("");
							}
							
										
							System.out.println("Lista de disciplinas\n");
							
							for (Disciplina disciplinas : auxiliarDisciplina) {
								System.out.println(i + " - " + disciplinas.getNome() + "\n" );
								i++;
							}
							
							
							
							System.out.print("Por favor, informe a opção desejada:");
							String leitura = lerDados.nextLine();
							options = Integer.parseInt(leitura);
										
							if (options > 0 && options < i){
									
								for (Disciplina disciplinas : auxiliarDisciplina){
										
									if (j == options){
										disciplina2 = disciplinas;
										break;
									}else{
										j++;
									}	
								}
							}
						
				/*----------------------------------------------------------------------------------------*/
				// Listando os professores			
				/*----------------------------------------------------------------------------------------*/
							i = 1;
							j = 1;
							options = 0;
							boolean continuar = true;
							
							
							
						

							for(int a=0;a<50;a++){
								System.out.println("");
							}
							
							
							
							System.out.println("Lista de professores\n");
							
							
							
							
							for (Professor professor : auxiliarProfessor) {
								for(Disciplina aux : professor.getDisciplinas()){
									if (disciplina2.getNome().equals(aux.getNome())) {
										System.out.println(i + " - " + professor.getNome() + "\n" );
										i++;
										professoresDisciplina.add(professor);
									}
								}
								
							}
							
							int cont = 1;
							while (continuar){
								
								System.out.print("Qual professor deseja adicionar?  ");
								leitura = lerDados.nextLine();
								options = Integer.parseInt(leitura);
								j = 1;
								
								if (options > 0 && options < i){
									
									for (Professor professor : professoresDisciplina) {
										
										if (j == options){
											listaDeProfessores.add(professor);
											break;
										} else {
											j++;
										}
										
									}
									
									
								}
								System.out.println("\n\n Deseja adicionar mais algum professor? S/N:");
								leitura = lerDados.nextLine();
								
								if(leitura.equals("N") || leitura.equals("n")){
									continuar = false;
								}
								
							}
							
			
				
				System.out.println("Informe o ano da Turma: ");
				leitura = lerDados.nextLine();
				int ano = Integer.parseInt(leitura);
				
				System.out.println("\n\nInforme o período da turma: ");
				leitura = lerDados.nextLine();
				int periodo = Integer.parseInt(leitura);
				
				System.out.println("\n\nInforme o local: ");
				String local = lerDados.nextLine();
				
				System.out.println("\n\nInforme o horario: ");
				String horario = lerDados.nextLine();
				
				System.out.println("\n\nInforme o número de vagas oferecidas: ");
				leitura = lerDados.nextLine();
				int numeroVagas = Integer.parseInt(leitura);
					
				
				boolean conti = true;

				while(conti){
					System.out.println("\n\nTurma cadastrada com sucesso!\n\n\n\n");
					System.out.println("\n\nAperte qualquer tecla para continuar ...\n");
					leitura = lerDados.nextLine();
					conti = false;
				}

				
				for(int l = 0; l<50;l++){
					System.out.println();
				}
				

				System.out.println("\n\nDeseja adicionar mais turmas? S/N: ");
				leitura = lerDados.nextLine();
				
				if(leitura.equals("N") || leitura.equals("n")){
					flag = -1;
				}
				
				
				
				turma = new Turma(ano,periodo,local,horario,numeroVagas,disciplina2,listaDeProfessores);
				disciplina2.adicionarNumeroTurmas();
				listaDeProfessores.clear();
				professoresDisciplina.clear();
				
				for (Professor professor : turma.getProfessor()) {
					System.out.println("Prof: "+professor.getNome());
				}
				
				turmaImpl.salvar(turma, 0);
				
			}
	
	}
	
/* -------------------------------------------------------------------------- */
// Lançar notas
/* -------------------------------------------------------------------------- */
	
	public void lancarNota(){
		
		Scanner lerDados = new Scanner(System.in);
		
		double nota = 0.0;
		HistoricoAtividade historicoAtividade = null;
		ArrayList<Turma> turmas = null;		
		ArrayList<Atividade> atividades = null;		
		ArrayList<Aluno> alunos = null;
		
		Turma turmaEscolhida = null;
		Atividade atividadeEscolhida = null;
		
		int j = 1;
		int option = 0;
	
		turmas = turmaImpl.getTurmas();
		System.out.println("\nLista de Turmas\n");
		
		for (Turma i : turmas) {
			System.out.println("Turma ("+ j + ") - " + "Numero de aulas:  " + "\t"+ "Ano: " +
				   	i.getAno() + "\tPeriodo: " + i.getPeriodo() + "\tLocal: " + i.getLocal() + 
				   	"\tHorario: " + i.getHorario() + "\tNumero de vagas: " + i.getNumeroVagas() + 
				   	"\tDisciplina: " + i.getDisciplina().getNome() + "\n\n");
			j++;
		}
		
		System.out.println("Informe a turma que deseja lançar nota: ");
		String leitura = lerDados.nextLine();
		option = Integer.parseInt(leitura);
		j = 1;
		
		for (Turma i : turmas) {
			if (j == option){
				turmaEscolhida = i;
				break;
			}else{
				j++;
			}
		}
		
		atividades = turmaEscolhida.getAtividades();
		
		if (atividades.size() == 0){
			System.out.println("A Turma não possui atividades");
		
		}else{
			j = 1;
			System.out.println("\nLista de Atividades da Turma escolhida\n");
			
			for (Atividade i : atividades) {
				System.out.println(j + " - " + "Nome: " + i.getNome() + "\t"+ "Tipo: " +
								   	i.getTipo() + "\tData: " + i.getData() + "\tValor: " + i.getValor() + "\n");
				j++;
			}
			
			System.out.println("Informe a atividade que deseja lançar nota: ");
			leitura = lerDados.nextLine();
			option = Integer.parseInt(leitura);
			j = 1;
			
			for (Atividade i : atividades) {
				if (j == option){
					atividadeEscolhida = i;
					break;
				}else{
					j++;
				}
			}
				
			alunos = turmaEscolhida.getListaDeAlunos();
			j = 1;
			System.out.println("\nLista de Alunos da Turma escolhida\n");
			
				for (Aluno i : alunos) {
					System.out.println(j + " - " + "Nome: " + i.getNome() + "\t"+ "CPF: " +
									   	i.getCpf() + "\n");
				
				
					
					System.out.println("Digite a nota para ser lançada: \n");
					leitura = lerDados.nextLine();
					nota = Double.parseDouble(leitura);
					
					historicoAtividade = new HistoricoAtividade(i,atividadeEscolhida,nota);
					historicoAtividadeImpl.salvar(historicoAtividade, 0);
				}
		}
}

/* -------------------------------------------------------------------------- */
// Alterar nota
/* -------------------------------------------------------------------------- */
	
public void alterarNota () {
	
	Scanner lerDados = new Scanner(System.in);
	
	double nota = 0.0;
	ArrayList<Turma> turmas = null;		
	ArrayList<Atividade> atividades = null;	
	ArrayList<HistoricoAtividade> historicoAtividades = null;
	ArrayList<Aluno> alunos = null;
	
	Turma turmaEscolhida = null;
	Aluno alunoEscolhido = null;
	Atividade atividadeEscolhida = null;
	
	int j = 1;
	int option = 0;
	int flag = 0;
	
	turmas = turmaImpl.getTurmas();
	System.out.println("\nLista de Turmas\n");
	
	for (Turma i : turmas) {
		System.out.println("Turma ("+ j + ") - " + "\tNumero de aulas:  "  + "\t"+ "Ano: " +
			   	i.getAno() + "\tPeriodo: " + i.getPeriodo() + "\tLocal: " + i.getLocal() + 
			   	"\tHorario: " + i.getHorario() + "\tNumero de vagas: " + i.getNumeroVagas() + 
			   	"\tDisciplina: " + i.getDisciplina().getNome() + "\n\n");
		j++;
	}
	
	System.out.println("Informe a turma que deseja alterar a nota: ");
	String leitura = lerDados.nextLine();
	option = Integer.parseInt(leitura);
	j = 1;
	
	for (Turma i : turmas) {
		if (j == option){
			turmaEscolhida = i;
			break;
		}else{
			j++;
		}
	}
	
	atividades = turmaEscolhida.getAtividades();
	
	if (atividades.size() == 0){
		System.out.println("A Turma não possui atividades.");
	
	}else{
	
		j = 1;
		System.out.println("\nLista de Atividades da Turma escolhida\n");
		
		for (Atividade i : atividades) {
			System.out.println(j + " - " + "Nome: " + i.getNome() + "\t"+ "Tipo: " +
							   	i.getTipo() + "\tData: " + i.getData() + "\tValor: " + i.getValor() + "\n");
			j++;
		}
		
		System.out.println("Informe a atividade que deseja alterar a nota: ");
		leitura = lerDados.nextLine();
		option = Integer.parseInt(leitura);
		j = 1;
		
		for (Atividade i : atividades) {
			if (j == option){
				atividadeEscolhida = i;
				break;
			}else{
				j++;
			}
		}
		
		alunos = turmaEscolhida.getListaDeAlunos();
		
		while (flag != -1) {
			
			j = 1;
			System.out.println("\nLista de Alunos da Turma escolhida\n");
			
				for (Aluno i : alunos) {
					System.out.println(j + " - " + "Nome: " + i.getNome() + "\tCPF: " +
									   	i.getCpf() + "\n");
					j++;
				}
				
				System.out.println("Informe o aluno que deseja alterar a nota: ");
				leitura = lerDados.nextLine();
				option = Integer.parseInt(leitura);
				j = 1;
				
				for (Aluno i : alunos) {
					if (j == option){
						alunoEscolhido = i;
						break;
					}else{
						j++;
					}
				}
				
				System.out.println("Digite a nova nota: \n");
				leitura = lerDados.nextLine();
				nota = Double.parseDouble(leitura);
				
				historicoAtividades = historicoAtividadeImpl.pesquisarHistoricoAtividade(alunoEscolhido);
				
				System.out.println(historicoAtividades);
				
				for (HistoricoAtividade i : historicoAtividades) {
					
					if (i.getAtividade().equals(atividadeEscolhida)) {
						
						i.setNota(nota); 
						
					}
				}
				
				System.out.println("Deseja alterar a nota de mais algum aluno? S/N");
				leitura = lerDados.nextLine();
				
				if(leitura.equals("N") || leitura.equals("n")){
					flag = -1;
				}
		}
	}
	
}
	
	
/* -------------------------------------------------------------------------- */
// Lançar faltas
/* -------------------------------------------------------------------------- */

public void lancarFaltas() {
	
	Scanner lerDados = new Scanner(System.in);
	
	ArrayList<Turma> turmas = null;		
	Faltas faltas = null;	
	ArrayList<Aluno> alunos = null;
	
	Turma turmaEscolhida = null;
				
	
	int j = 1;
	int option = 0;
	int nfaltas;
	turmas = turmaImpl.getTurmas();
	System.out.println("\nLista de Turmas\n");
	
	for (Turma i : turmas) {
		System.out.println("Turma ("+ j + ") - " + "\tNumero de aulas:  " + "\t"+ "Ano: " +
			   	i.getAno() + "\tPeriodo: " + i.getPeriodo() + "\tLocal: " + i.getLocal() + 
			   	"\tHorario: " + i.getHorario() + "\tNumero de vagas: " + i.getNumeroVagas() + 
			   	"\tDisciplina: " + i.getDisciplina().getNome() + "\n\n");
		j++;
	}
	
	System.out.println("Informe a turma que deseja lançar faltas: ");
	String leitura = lerDados.nextLine();
	option = Integer.parseInt(leitura);
	j = 1;
	
	for (Turma i : turmas) {
		if (j == option){
			turmaEscolhida = i;
			break;
		}else{
			j++;
		}
	}
	
	alunos = turmaEscolhida.getListaDeAlunos();
	
	if (alunos.size() == 0){
		System.out.println("A turma não possui alunos.");
	}else{
	
		j = 1;
		System.out.println("\nLista de Alunos da Turma escolhida\n");
		
			for (Aluno i : alunos) {
				System.out.println(j + " - " + "Nome: " + i.getNome() + "\tCPF: " +
								   	i.getCpf() + "\n");
			
			
				
				System.out.println("Digite o numero de faltas: \n");
				leitura = lerDados.nextLine();
				nfaltas = Integer.parseInt(leitura);
				j++;
				Faltas falta = i.getFaltas(turmaEscolhida);
				falta.setNumeroFaltas(nfaltas);
				
				
			}
	}		
	
}
		

/* -------------------------------------------------------------------------- */
// Definir status
/* -------------------------------------------------------------------------- */

		public void definirStatus(){
			Scanner lerDados = new Scanner(System.in);
			
			double nota = 0.0;
			String aprovacao;
			int j = 1;
			int option;
			int idAtividadeAluno;
			double calcularNota = 0;
			double calculo = 0.0;
			ArrayList<HistoricoAtividade> listaDeHistoricosAtividades;
			ArrayList<Faltas> faltas = null;
			ArrayList<Turma> turmas = null;
			Turma turmaEscolhida = null;
			Aluno aluno;
			Disciplina disciplina = null;
			ArrayList<HistoricoDisciplina> historicosDisciplinas = null;
			
			turmas = turmaImpl.getTurmas();
			System.out.println("\nLista de Turmas\n");
			
			for (Turma i : turmas) {
				System.out.println(j + " - " + "\tAno: " +
								   	i.getAno() + "\tPeriodo: " + i.getPeriodo() + "\tLocal: " + i.getLocal() + 
								   	"\tHorario: " + i.getHorario() + "\tNumero de vagas: " + i.getNumeroVagas() + 
								   	"\tDisciplina: " + i.getDisciplina().getNome()+"\n");
				j++;
			}
			
			System.out.println("Informe a turma que deseja lançar nota final: ");
			String leitura = lerDados.nextLine();
			option = Integer.parseInt(leitura);
			j = 1;
			
			for (Turma i : turmas) {
				if (j == option){
					turmaEscolhida = i;
					break;
				}else{
					j++;
				}
			}
			
			faltas = turmaEscolhida.getFaltas();
			
			if (faltas.size() == 0){
				System.out.println("A turma não possui alunos.");
			}else{
			
				disciplina = turmaEscolhida.getDisciplina();
				
				for (Faltas j1 : faltas) {
					nota = 0.0;
					aluno = j1.getAluno();	
					listaDeHistoricosAtividades = aluno.getHistoricosAtividade();
					
					for (HistoricoAtividade i : listaDeHistoricosAtividades) {
						idAtividadeAluno = i.getAtividade().getTurma().getId();
	
						if (idAtividadeAluno == turmaEscolhida.getId()){
							nota = nota + i.getNota();
						}
					}
				
					historicosDisciplinas = aluno.getHistoricosDisciplinas();
					
					for (HistoricoDisciplina k : historicosDisciplinas) {
						if (k.getDisciplina().getNome().equals(disciplina.getNome())){
							
							calculo = (j1.getNumeroFaltas()*100)/turmaEscolhida.getDisciplina().getCargaHoraria();
							
							calcularNota = (nota*100)/turmaEscolhida.getSomaDeNotas();
							
							k.setNota(calcularNota);
							
							if (calculo < 25.0 && calcularNota > 60.0){
								aprovacao = "Aprovado";
							}else{
								aprovacao = "Reprovado";
							}
							k.setAprovacao(aprovacao);
							break;
						}
					}
				}
			}
}

		
/* -------------------------------------------------------------------------- */
// Add aluno na turma
/* -------------------------------------------------------------------------- */
		public void adicionarAlunoNaTurma(){
			Scanner lerDados = new Scanner(System.in);
			
			ArrayList<Turma> turmas = null;				
			ArrayList<Aluno> alunos = null;
			
			Turma turmaEscolhida = null;
			Aluno alunoEscolhido = null;
			Faltas faltas = null;
			HistoricoDisciplina historicoDisciplina = null;
			
			int j = 1;
			int option = 0;
			int continuar = 0;
			
			turmas = turmaImpl.getTurmas();
			
			
			for(int a=0;a<50;a++){
				System.out.println("");
			}
			
			System.out.println("\nLista de Turmas\n");
			
			for (Turma i : turmas) {
				System.out.println("Turma ("+ j + ") - " + "Numero de aulas:  " + "\t"+ "Ano: " +
					   	i.getAno() + "\tPeriodo: " + i.getPeriodo() + "\tLocal: " + i.getLocal() + 
					   	"\tHorario: " + i.getHorario() + "\tNumero de vagas: " + i.getNumeroVagas() + 
					   	"\tDisciplina: " + i.getDisciplina().getNome() + "\n\n");
				j++;
			}
			
			System.out.println("\n\nInforme a turma que deseja adicionar alunos: ");
			String leitura = lerDados.nextLine();
			option = Integer.parseInt(leitura);
			j = 1;
			
			for (Turma i : turmas) {
				if (j == option){
					turmaEscolhida = i;
					break;
				}else{
					j++;
				}
			}
			
			alunos = alunoImpl.getListaDeAlunos();
			
			if (alunos.size() == 0){
				System.out.println("Não existem alunos cadastrados.");
			}else{
				
			
				for(int a=0;a<50;a++){
					System.out.println("");
				}
				
				
					j = 1;
					System.out.println("\n:: Lista de Alunos ::\n");
					
					for (Aluno i : alunos) {
						System.out.println(j + " - " + "Nome: " + i.getNome() + "\t"+ "CPF: " +
										   	i.getCpf() + "\n\n");
						j++;
					}
				
					
					while (continuar == 0){
						
						
						System.out.println("Informe o aluno que deseja adicionar na turma: ");
						leitura = lerDados.nextLine();
						option = Integer.parseInt(leitura);
						j = 1;
						
					
						
						for (Aluno i : alunos) {
							if (j == option){
								
								alunoEscolhido = i;
								faltas = new Faltas(alunoEscolhido, turmaEscolhida,0);
								historicoDisciplina = new HistoricoDisciplina(alunoEscolhido, turmaEscolhida.getDisciplina());
								faltasImpl.adicionarFaltas(faltas);
								historicoDisciplinaImpl.adicionarHistoricoDisciplina(historicoDisciplina);
								
								break;
							}else{
								
								j++;
							}
						}
						
						System.out.println("\n\nDeseja adicionar mais alunos? S/N:");
						leitura = lerDados.nextLine();
						
						if(leitura.equals("N") || leitura.equals("n")){
							continuar = -1;
						}
						
					}
					
		}
}
		
/* -------------------------------------------------------------------------- */
// Listar Alunos
/* -------------------------------------------------------------------------- */
	
	public void listarAlunos(){
		Scanner lerDados = new Scanner(System.in);
		Turma turma = null;
		System.out.println("\n\n:: Lista de Turmas :: \n\n");
		int j = 1;
		
		
		
		for (Turma i : turmaImpl.getTurmas()) {
			System.out.println(turmaImpl.getTurmas().size());
			System.out.println("Turma ("+ j + ") - " + "Numero de aulas:  " + "\t"+ "Ano: " +
							   	i.getAno() + "\tPeriodo: " + i.getPeriodo() + "\tLocal: " + i.getLocal() + 
							   	"\tHorario: " + i.getHorario() + "\tNumero de vagas: " + i.getNumeroVagas() + 
							   	"\tDisciplina: " + i.getDisciplina().getNome() + "\n\n");
			j++;
		}
		
		System.out.println("\n\nQual turma deseja listar os alunos? \n");
		String leitura = lerDados.nextLine();
		int option = Integer.parseInt(leitura);
		
		j = 1;
		int h = 1;
		
		
		for(int i=0;i<50;i++){
			System.out.println("");
		}
		
		if (turmaImpl.getTurmas().size() == 0){
			System.out.println("Não existem alunos cadastrados nessa turma.");
		}else{
			
				
			System.out.println("\n\n :: Lista de Alunos :: \n\n");
			
			for (Turma i : turmaImpl.getTurmas()) {
				if (j == option){
					
					for(Aluno k: i.getListaDeAlunos()){
						double soma = 0.0;
						for(HistoricoAtividade hist: k.getHistoricosAtividade()){
							soma = soma + hist.getNota();
						}
						
						System.out.println(h + " - Nome: " + k.getNome() + "\tCPF: " + k.getCpf() + "\t   Somatorio das Notas: "+ soma);
						h++;
					}
					
					
					break;
				}else{
					j++;
				}
			}
			boolean cont = true;
			
			while(cont){
				System.out.println("\n\nTecle 1 para sair ...\n");
				leitura = lerDados.nextLine();
				int opt = Integer.parseInt(leitura);
				if (opt==1){
					cont = false;
				}
			}
		
	}
		
}

	/* -------------------------------------------------------------------------- */
	// Consultar numero de turmas historicamente
	/* -------------------------------------------------------------------------- */
		
	public int consultarNumeroTurmas (Disciplina disciplina) {
		
		return disciplina.getNumeroTurmasOferecidas();
		
	}

	
}